package com.cn.delan.core.util.io;

import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
/**
 * 输出线程类，利用线程进行非阻塞读取并输出。
 * @author BingGo
 *
 */
public class OThread extends Thread {
	
	private OutputStream out;
	private byte b[];
	private int len;
	/**
	 * 初始化输出线程类，默认字节缓存1024字节。
	 * @param out 要进行写入的输出类
	 */
	public OThread(OutputStream out){
		this.out = out;
		this.b = new byte[1024];
	}
	/**
	 * 初始化输出线程类，设置字节缓存。
	 * @param out 要进行写入的输出类
	 * @param cacheSize 字节缓存大小
	 */
	public OThread(OutputStream out,int cacheSize){
		this.out = out;
		this.b = new byte[cacheSize];
	}
	@Override
	public void run(){
		try {
			this.write();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 读取信息后即时输出到输出流。
	 * 默认通过System.in读取信息。
	 * 如果需要以其他形式读取信息，需要重写此方法。重写时需要注意即时进行out.flush()，以便即时响应。
	 * 例如：可以通过Socket,Process等读取信息。
	 * @throws IOException
	 */
	protected void write() throws IOException{
		while((len=System.in.read(this.b))!=-1 && !this.isInterrupted()){
			String s = new String(this.b,0,this.len,"GBK");
			this.out.write(s.getBytes());
			this.out.flush();
			if(s.trim().equals("quit")){
				break;
			}
		}
	}
	/**
	 * 将 b.length 个字节从指定的 byte 数组写入此输出流。
	 * @param b 数据。
	 * @throws IOException
	 */
	public void write(byte []b) throws IOException{
		this.out.write(b);
		this.out.flush();
	}
	/**
	 * 将指定的字节写入此输出流。
	 * @param b 数据
	 * @throws IOException
	 */
	public void write(int b) throws IOException{
		this.out.write(b);
		this.out.flush();
	}
	/**
	 * 指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
	 * write(b, off, len) 的常规协定是：将数组 b 中的某些字节按顺序写入输出流；元素 b[off] 是此操作写入的第一个字节，b[off+len-1] 是此操作写入的最后一个字节。
	 * @param b 数据。
	 * @param offset 数据中的初始偏移量。
	 * @param len 要写入的字节数。
	 * @throws IOException
	 */
	public void write(byte []b,int offset,int len) throws IOException{
		this.out.write(b,offset,len);
		this.out.flush();
	}

}
